SublimeSocket でRubyの実行とRuntimeなエラーの表示
概要
サンプルとして作ってみた。
Sublime Text でコードを保存すると、shellが走ってRuby実行、
エラーが出ればコード上にエラー行を表示する。
サンプル一式
コードとか一式がSublimeSocket3 のフォルダ内に入っている
hello.rb
log.txt
rubyFilter.txt
保存時のエディタ挙動
各ファイルをみていく。
hello.rb
# show runtime error when save. see ./rubyFilter.txt
pauts "hello world"
実行対象のルッビファイル
いきなりtypoがあり、実行時にはエラーを吐く。
log.txt
実行ログが吐かれるところ。
rubyFilter.txt
// use RuhSushiJSON for running.
// this file is writtern by SushiJSON-lang (https://github.com/sassembla/SushiJSON)
showAtLog: {
"message": "start defining for ruby."
}->defineFilter: {
"name": "rubyFilter",
"filters": [
{
// error
// e.g.)hello.rb:3: undefined local variable or method `somethingwrong' for main:Object (NameError)
"(.*?):([0-9].*): (.*)\n": {
"injects": {
"groups[0]": "name",
"groups[1]": "line",
"source": "message"
},
"selectors": [
{
"showAtLog<-message": {
}
},
{
"appendRegion<-name, line, message": {
"condition": "keyword"
}
}
]
}
}
]
}->setViewReactor: {
"react": "on_post_save",
"reactors": [
{
"showAtLog": {
"message": "saved."
}
},
{
"eraseAllRegions": {
}
},
{
"runShell": {
"main": "/bin/sh",
"": "/Users/highvision/Desktop/rubySample/run.sh"
}
}
]
}->startTailing: {
"identity": "sample ruby tail",
"path": "/Users/highvision/Desktop/rubySample/log.txt",
"reactors": [
{
"filtering<-source": {
"name": "rubyFilter"
}
}
]
}->showAtLog: {
"message": "ruby setting done."
}
でけえ。。。
保存時にshellの起動、
エラーログにtailハンドラを追加、
エラーをファイル上に表示、
の3つのリアクターを順にセットしている。
赤文字の部分にファイルパスが直書きしてある。
実行
・SublimeSocket3をST3のpackageに入れる
・sample/rubySample フォルダを適当にどこかにコピー
・rubyFilter.txt 内のパスを変更(runShellとstartTailing)
https://github.com/sassembla/SublimeSocket3/blob/master/samples/rubySample/rubyFilter.txt#L48
https://github.com/sassembla/SublimeSocket3/blob/master/samples/rubySample/rubyFilter.txt#L50
https://github.com/sassembla/SublimeSocket3/blob/master/samples/rubySample/rubyFilter.txt#L57
・CommandPalette > "SublimeSocket: run SushiJSON"
・画面下のバーに入力窓がでるので、rubyFilter.txtのファイルパスを入れてエンター
どこか/rubyFilter.txt
で、以降、hello.rb の保存時に自動でに実行され、エラーがあると赤く囲んで表示される。
動作は全部SublimeSocket3のAPIから実行しているだけなので、
node叩いたりgradle叩いたりも出来ると思う。
勿論ログからエラーだしたり。
以上。